const express = require("express");
const app = express();

app.listen("80", () => {
  console.log("127.0.0.1");
});

// 全局生效的中间件
app.use((req, res, next) => {
  console.log("全局中间件函数`1");
  // 获取到请求到达服务器的时间
  const time = Date.now();
  // 为 req 对象，挂载自定义属性，从而把时间共享给后面的所有路由
  req.startTime = time;

  // 表示把流转关系交给下一个中间价或路由器
  next();
});

app.use((req, res, next) => {
  console.log("全局中间件函数`2");
  // 表示把流转关系交给下一个中间价或路由器
  next();
});
// !多个中间件之间 共享同一份req和res 我们可以给上游中间件 给req res添加自定义属性和方法

// 局部中间件
const mw1 = (req, res, next) => {
  console.log("局部中间件`1");
  next();
};
const mw2 = (req, res, next) => {
  console.log("局部中间件`2");
  next();
};

app.get("/", (req, res) => {
  console.log("/ :" + req.startTime);
  res.send("Home page.");
});
// !先全局中间件 再局部中间件
app.get("/user", [mw1, mw2], (req, res) => {
  console.log("/user :" + req.startTime);
  res.send("User page.");
});

app.get("/err", (req, res) => {
  // 人为的制造错误
  throw new Error("服务器内部发生了错误！");
  res.send("ERR page."); // 不执行
});

// 定义错误级别的中间件，捕获整个项目的异常错误，从而防止程序的崩溃
// !错误级别的中间件，放到所有路由之后
app.use((err, req, res, next) => {
  console.log("发生了错误！" + err.message);
  res.send("Error：" + err.message);
});
